package com.yzg.simple.netty.websoket;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;

import java.time.LocalDateTime;

/**
 * @author misterWei
 * @mailbox mynameisweiyan@gmail.com
 *
 * webSocket 是以帧 的方式发送接受数据的所以我们遵循这个规则就行
 * TextWebSocketFrame 就是WebSocketFrame 下的一种 文本格式的传输类型
 */
public class NettyWebSoketServerHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {
        //得到客户端消息,在返回到客户端
        String mes = msg.text();
        String serverMes = "服务器 : "+LocalDateTime.now() + mes;
        ctx.writeAndFlush(new TextWebSocketFrame(serverMes));

    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        System.out.println("异常为:"+ cause.getMessage() + "channelId = "+ctx.channel().id().asLongText());
        ctx.close();
    }

    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        // asLongText 是每一个Channel 的唯一标识 不会重复.
        //asShortText 是每一个Channel 都存在的,但是很有可能会重复.
        String asLongText = ctx.channel().id().asLongText();
        String asShortText = ctx.channel().id().asShortText();
        System.out.println("客户端连接了!!!" + asLongText);
        ctx.writeAndFlush(new TextWebSocketFrame("客户端连接了!!!" + asLongText));
    }

    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
        System.out.println("客户端掉线了!!!" + ctx.channel().id().asLongText());
    }
}
